/**
 * виджет ajax-загрузки файлов
 */

;(function($){

// удалить теги
  $.extend(String.prototype, {stripTags: function(){return this.replace(/<.*?>/g,"");}});

  $.widget("ui.uploader", {
    options: {src: "", title: "", param: "source", url: "", remove: ""},
  // конструктор
    _create: function()
             {
               var self = $.extend(this, {
                 form        : $("<form />", {
                                 name   : this.options.param + "-uploader",
                                 action : this.options.url,
                                 method : "post",
                                 enctype: "multipart/form-data"
                               }).appendTo(document.body),
                 input       : $("<input />", {
                                 type : "file",
                                 name : this.options.param,
                                 style: "position:absolute;left:-1000px;top:-1000px;cursor:pointer;z-index:1000;opacity:0;filter:alpha(opacity:0);-moz-opacity:0;",
                                 title: this.options.title
                               }).change(function()
                               {
                                 $(this.form).ajaxSubmit({dataType: "text", resetForm: true, success: function(filename)
                                 {
                                   if (self.setSrc(filename))
                                     self.element.triggerHandler("upload", self.options.src);
                                 }});
                               }),
                 _onMouseMove: function(e)
                               {
                                 var p = self.element.offset();
                                 $.extend(p, {right: p.left + self.element.width(), bottom: p.top  + self.element.height()});
                                 var disabled = (e.pageX < p.left) || (p.right < e.pageX) || (e.pageY < p.top) || (p.bottom < e.pageY);
                                 with (self.input)
                                   css({left: (disabled ? -1000 : e.pageX + 25) - width(), top: (disabled ? -1000 : e.pageY + 10) - height()});
                                 self.element.parent().toggleClass("ui-state-hover", !disabled);
                               },
                 _onUnload   : function(){self.remove();}
               });
               this.input.appendTo(this.form).add(this.element).mousemove(this._onMouseMove);
               $(window).unload(this._onUnload);
             },
  // деструктор
    destroy: function()
             {
               this.remove();
               $(window).unbind("unload", this._onUnload);
               this.element.unbind("mousemove", this._onMouseMove);
               this.form.remove();
             },
  // установить имя загруженного файла
    setSrc : function(src){this.remove();return this.options.src=src.stripTags();},
  // разорвать связь с источником
    clear  : function(){this.options.src="";},
  // удалить загруженный файл
    remove : function(filename)
             {
               if ((filename = filename || this.options.src) && this.options.remove)
               {
                 var e      = this.element;
                 var params = {};
                 params[this.options.param] = filename;
                 $.post(this.options.remove, params, function(){e.triggerHandler("unlink",filename);});
               }
             }
  });

})(jQuery);
